package com.bjsxt.service.impl;

import cn.hutool.core.lang.Snowflake;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bjsxt.domain.Market;
import com.bjsxt.domain.UserFavoriteMarket;
import com.bjsxt.mapper.UserFavoriteMarketMapper;
import com.bjsxt.service.MarketService;
import com.bjsxt.service.UserFavoriteMarketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserFavoriteMarketServiceImpl extends ServiceImpl<UserFavoriteMarketMapper, UserFavoriteMarket> implements UserFavoriteMarketService {
    /**
     * 交易市场业务层对象
     */
    @Autowired
    private MarketService marketService;
    /**
     * 雪花算法注入
     */
    @Autowired
    private Snowflake snowflake;

    /**
     * 根据用户 ID 获取用户的收藏列表
     *
     * @param userId 用户 id
     * @return 收藏列表集合
     */
    @Override
    public List<UserFavoriteMarket> listByUserId(Long userId) {
        // 调用方法进行数据的查询
        return list(new LambdaQueryWrapper<UserFavoriteMarket>().eq(UserFavoriteMarket::getUserId, userId));
    }

    /**
     * 根据用户 id 和交易对标识和类型保存一个收藏数据
     *
     * @param userId 用户 id
     * @param symbol 交易对标识
     * @param type   类型：1-数字货币；2：创新交易
     * @return true 保存成功 false 保存失败
     */
    @Override
    public boolean saveByUserIdAndSumbolAndType(Long userId, String symbol, Byte type) {
        // 调用 market 业务层进行数据的查询
        Market market = marketService.getBySymbol(symbol);
        // 如果获取的数据是空则添加失败
        if (market == null) return false;
        // 创建需要保存的数据对象
        UserFavoriteMarket userFavoriteMarket = new UserFavoriteMarket(snowflake.nextId(), type, userId, market.getId());
        // 调用方法进行数据的保存
        return save(userFavoriteMarket);
    }

    /**
     * 根据用户 id 和交易对标识和类型删除一个收藏数据
     *
     * @param userId 用户 id
     * @param symbol 交易对标识
     * @return true 删除成功 false 删除失败
     */
    @Override
    public boolean removeByUserIdAndSymbol(Long userId, String symbol) {
        // 调用 market 业务层进行数据的查询
        Market market = marketService.getBySymbol(symbol);
        // 如果获取的数据是空则删除失败
        if (market == null) return false;
        // 根据条件进行数据的删除并返回
        return remove(new LambdaQueryWrapper<UserFavoriteMarket>()
                .eq(UserFavoriteMarket::getUserId, userId)
                .eq(UserFavoriteMarket::getMarketId, market.getId()));
    }
}
